package template.drink;

import java.util.Arrays;

/**
　　* @description: 模板模式中的泡茶和咖啡问题
   * 把固定的步骤抽象成final方法 模板是抽象类 固定的步骤里既有抽象方法也有普通方法
   * 普通方法直接用final关键字声明防止被子类覆写 抽象方法让子类自己实现
　　* @author 周杨
　　* @date 2019/5/28  15:49
　　*/
public abstract class AbstractHotDrinkTemplate {
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (wantCondimentsHook()) {
            addCondiments();
        } else {
            System.out.println("No Condiments");
        }
    }

    //这个允许子类自己覆盖 这样就达到了扩展性的要求
    public boolean wantCondimentsHook() {
        return true;
    }

    private void boilWater() {
        System.out.println("Boiling water");
    }

    /**
     * 冲泡
     */
    public abstract void brew();

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }

    /**
     * 加佐料
     */
    public abstract void addCondiments();
}
